package semantico;

import lexico.Numero;
import lexico.Palavra;
import lexico.Tag;
import lexico.Token;
import simbolos.Tipo;

/**
 * Implementa codigo de tres enderecos para constante
 * @author Cefanys
 *
 */
public class Constante extends Expressao {

	public Constante(Token token, Tipo tipo){
		super(token, tipo);
	}
	
	public Constante(int numero){
		super(new Numero(numero), Tipo.INTEIRO);
	}
	
	public static final Constante
		True = new Constante(new Palavra("true", Tag.VERDADEIRO), Tipo.LOGICO),
		False = new Constante(new Palavra("false", Tag.FALSO), Tipo.LOGICO);
	
	/**
	 * Gera um desvio para saida verdadeira se ela for diferente de 0 e a constante for um objeto True ou
	 * um desvio para saida falsa se ela for diferente de 0 e a constante for um objeto False.
	 */
	public void desviar(int saidaVerdadeira, int saidaFalsa){
		if(this == True && saidaVerdadeira != 0){
			emitirCodigo("goto L"+ saidaVerdadeira);
		}else if(this == False && saidaFalsa != 0){
			emitirCodigo("goto L" + saidaFalsa);
		}
	}
}
